在理解“ Spring @Autowired用法”这个问题之后,我想为弹簧接线的另一个选项(@Configuration类)创建一个完整的知识库。
@Configuration
假设我有一个看起来像这样的spring XML文件:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <import resource="another-application-context.xml"/> <bean id="someBean" class="stack.overflow.spring.configuration.SomeClassImpl"> <constructor-arg value="${some.interesting.property}" /> </bean> <bean id="anotherBean" class="stack.overflow.spring.configuration.AnotherClassImpl"> <constructor-arg ref="someBean"/> <constructor-arg ref="beanFromSomewhereElse"/> </bean> </beans>
我该如何使用@Configuration呢?它对代码本身有影响吗?
将XML迁移到 @Configuration @Configuration只需几个步骤即可将xml迁移到:
@Configuration public class MyApplicationContext { }
<bean>
@Bean
@Configuration public class MyApplicationContext { @Bean(name = "someBean") public SomeClass getSomeClass() { return new SomeClassImpl(someInterestingProperty); // We still need to inject someInterestingProperty } @Bean(name = "anotherBean") public AnotherClass getAnotherClass() { return new AnotherClassImpl(getSomeClass(), beanFromSomewhereElse); // We still need to inject beanFromSomewhereElse } }
beanFromSomewhereElse
@ImportResource
@ImportResource("another-application-context.xml") @Configuration public class MyApplicationContext { ... }
如果bean是在另一个@Configuration类中定义的,则可以使用@Import注释:
@Import
@Import(OtherConfiguration.class) @Configuration public class MyApplicationContext { ... }
@Autowired @Qualifier(value = "beanFromSomewhereElse") private final StrangeBean beanFromSomewhereElse;
或者用它直接作为在其中定义了取决于该豆的方法参数beanFromSomewhereElse使用@Qualifier如下:
@Bean(name = "anotherBean") public AnotherClass getAnotherClass(@Qualifier (value = "beanFromSomewhereElse") final StrangeBean beanFromSomewhereElse) { return new AnotherClassImpl(getSomeClass(), beanFromSomewhereElse); }
@Qualifier
@Value
@Autowired @Value("${some.interesting.property}") private final String someInterestingProperty;
这也可以与SpEL表达式一起使用。
<context:annotation-config/>
现在,你可以导入@Configuration与创建简单bean完全相同的类:
<bean class="some.package.MyApplicationContext"/>
有一些方法可以完全避免使用Spring XML,但是它们不在此答案的范围内。你可以在我基于其答案的博客文章中找到这些选项之一。
使用此方法的优缺点
基本上,由于一些优势,我发现这种声明bean的方法比使用XML更舒适。
Typos - @Configuration
Fail fast (compile time)
Easier to navigate in IDE
正如我所看到的那样,缺点并不多,但我可以想到一些缺点: